package com.hzlj.position.locate.service.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import com.fz.common.base.core.CollectionUtils;
import com.fz.common.base.dto.PageParamDTO;
import com.fz.common.base.dto.QueryPageResultDTO;
import com.fz.common.dict.annotation.DictConvert;
import com.hzlj.position.locate.common.dto.position.PositionHandleDTO;
import com.hzlj.position.locate.common.dto.positionNewestEffective.PositionNewestEffectiveQueryParamDTO;
import com.hzlj.position.locate.common.dto.positionNewestEffective.PositionNewestEffectiveQueryResultDTO;
import com.hzlj.position.locate.common.dto.positionNewestEffective.PositionNewestEffectiveSimpleResultDTO;
import com.hzlj.position.locate.common.model.Position;
import com.hzlj.position.locate.common.model.PositionNewestEffective;
import com.hzlj.position.locate.dao.PositionNewestEffectiveDao;
import com.hzlj.position.locate.mapper.PositionNewestEffectiveMapper;
import com.hzlj.position.locate.service.PositionNewestEffectiveService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 定位记录-最新有效位置(PositionNewestEffective)表服务接口
 *
 * @author makejava
 * @date 2024-01-17 11:18:17
 */
@Slf4j
@Service
public class PositionNewestEffectiveServiceImpl implements PositionNewestEffectiveService {
    @Resource
    private PositionNewestEffectiveDao positionNewestEffectiveDao;
    @Resource
    private PositionNewestEffectiveMapper positionNewestEffectiveMapper;

    @Override
    public PositionNewestEffectiveSimpleResultDTO getPositionNewestEffective(String jzId) {
        return positionNewestEffectiveDao.getPositionNewestEffective(jzId);
    }

    @Override
    public List<String> listJzIds(Date startTime, Date endTime) {
        return positionNewestEffectiveDao.listJzIds(startTime, endTime);
    }

    @Override
    public void saveBatch(List<Position> positions) {
        if (ObjectUtil.isEmpty(positions)) {
            return;
        }
        //去重
        List<PositionNewestEffective> adds = positions.stream().map(e -> {
                    PositionNewestEffective add = BeanUtil.copyProperties(e, PositionNewestEffective.class);
                    add.setPositionId(e.getId());
                    return add;
                })
                .filter(CollectionUtils.distinctByKey(e -> e.getJzId() + ":" + e.getChannelType()))
                .collect(Collectors.toList());

        //拼接SQL(为了效率问题)
        String removeKeys = adds.stream().map(e -> "('" + e.getJzId() + "','" + e.getChannelType() + "')").collect(Collectors.joining(","));
        positionNewestEffectiveMapper.removeKeys(removeKeys);
        //新增
        positionNewestEffectiveDao.saveBatch(adds);
    }

    @Override
    public void handle(PositionHandleDTO dto) {
        positionNewestEffectiveDao.handle(dto);
    }
    /**
     * 查询列表：不分页
     */
    @Override
    @DictConvert
    public List<PositionNewestEffectiveQueryResultDTO> listPositionNewestEffective(PositionNewestEffectiveQueryParamDTO dto){
        return this.positionNewestEffectiveDao.listPositionNewestEffective(dto);
    }

    /**
     * 查询列表：分页
     */
    @Override
    @DictConvert
    public QueryPageResultDTO<PositionNewestEffectiveQueryResultDTO> pagePositionNewestEffective(PositionNewestEffectiveQueryParamDTO dto, PageParamDTO page){
        return this.positionNewestEffectiveDao.pagePositionNewestEffective(dto,page);
    }
}
